from werkzeug.security import check_password_hash, generate_password_hash
from . import db

# 系统管理
class Admin(db.Model):
    __tablename__ = 'admin_user'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False, unique=True)
    admin_name = db.Column(db.String(255), nullable=False)  # 管理员名称
    password = db.Column(db.String(255), nullable=False)

    def set_password(self, password):
        """设置加密后的密码"""
        self.password = generate_password_hash(password)

    def check_password(self, password):
        """检查密码是否正确"""
        return check_password_hash(self.password, password)

    def __repr__(self):
        return f'<User {self.name}>'

# 用户管理
class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100), nullable=False, unique=True)
    password = db.Column(db.String(100), nullable=False)
    employee_id = db.Column(db.String(50), nullable=False, unique=True)
    gender = db.Column(db.String(10), nullable=False)
    phone = db.Column(db.String(15))
    created_at = db.Column(db.DateTime, default=db.func.now())

    def set_password(self, password):
        """设置加密后的密码"""
        self.password = generate_password_hash(password)

    def check_password(self, password):
        """检查密码是否正确"""
        return check_password_hash(self.password, password)

    def __repr__(self):
        return f'<User {self.username}>'


# 宿舍管理
class Dorm(db.Model):
    __tablename__ = 'dorm'  # 使用小写 'dorm'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 自动增长
    dorm_typeid = db.Column(db.Integer, db.ForeignKey('dorm_type.id'))  # 外键指向 dorm_type 表的 id 字段
    name = db.Column(db.String(100), nullable=False)  # 宿舍名称
    typename = db.Column(db.String(100), nullable=False)  # 宿舍类型
    bed_count = db.Column(db.Integer, nullable=False)  # 总床位数
    occupied = db.Column(db.Integer, default=0)  # 当前已住人数
    created_at = db.Column(db.DateTime, default=db.func.current_timestamp())  # 创建时间

    # 定义与 DormType 表的关系
    dorm_type = db.relationship('DormType', backref='dorms')

    def __init__(self, dorm_typeid, name, typename, bed_count):
        self.dorm_typeid = dorm_typeid
        self.name = name
        self.typename = typename
        self.bed_count = bed_count
        self.occupied = 0  # 初始化时已住人数为 0

    def __repr__(self):
        return f"<Dorm {self.name}>"


# 宿舍楼栋
class DormType(db.Model):
    __tablename__ = 'dorm_type'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 设置自增
    name = db.Column(db.String(50), nullable=False)

    def __repr__(self):
        return f"<DormType {self.name}>"


# 分配管理
class Allocation(db.Model):
    __tablename__ = 'allocation'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)  # 外键指向 user 表的 id 字段
    dorm_id = db.Column(db.Integer, db.ForeignKey('dorm.id'), nullable=False)  # 外键指向 dorm 表的 id 字段
    allocation_time = db.Column(db.DateTime, default=db.func.current_timestamp())  # 分配时间
    check_in_time = db.Column(db.DateTime)  # 入住时间
    change_time = db.Column(db.DateTime, default=None)  # 新增更换宿舍的时间字段
    status = db.Column(db.String(50), default='已分配')  # 状态（已分配、已入住、已退房）

    # 定义与 User 和 Dorm 表的关系
    user = db.relationship('User', backref='allocations')
    dorm = db.relationship('Dorm', backref='allocations')

    def __repr__(self):
        return f"<Allocation {self.user.username} -> {self.dorm.name}>"


class Meter(db.Model):
    __tablename__ = 'meter'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    dorm_id = db.Column(db.Integer, db.ForeignKey('dorm.id'), nullable=False)  # 外键指向 dorm 表的 id 字段
    month = db.Column(db.DateTime, nullable=False)  # 记录月份
    water_reading = db.Column(db.Float, nullable=False)  # 水表读数
    electricity_reading = db.Column(db.Float, nullable=False)  # 电表读数

    # 定义与 Dorm 表的关系
    dorm = db.relationship('Dorm', backref='meters')

    def __repr__(self):
        return f"<Meter {self.dorm.name} - {self.month.strftime('%Y-%m')}>"


class UtilityFee(db.Model):
    __tablename__ = 'utility_fee'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    dorm_id = db.Column(db.Integer, db.ForeignKey('dorm.id'), nullable=False)  # 外键指向 dorm 表的 id 字段
    month = db.Column(db.DateTime, nullable=False)  # 记录月份
    water_fee = db.Column(db.Float, nullable=False)  # 水费
    electricity_fee = db.Column(db.Float, nullable=False)  # 电费
    total_fee = db.Column(db.Float, nullable=False)  # 总费用（包括水电费）

    # 定义与 Dorm 表的关系
    dorm = db.relationship('Dorm', backref='utility_fees')

    def __repr__(self):
        return f"<UtilityFee {self.dorm.name} - {self.month.strftime('%Y-%m')}>"
